home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 February / GAME_2.ISO / utilities / Opera 5.01 / Opera501_final_nonjava.exe / OPERA.JAR / opera / PluginPanel.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-12-07  |  7.4 KB  |  387 lines

  1. package opera;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AppletContext;
  5. import java.applet.AppletStub;
  6. import java.awt.BorderLayout;
  7. import java.awt.Component;
  8. import java.awt.Container;
  9. import java.awt.FontMetrics;
  10. import java.awt.Graphics;
  11. import java.awt.Panel;
  12. import java.net.MalformedURLException;
  13. import java.net.URL;
  14. import java.util.Hashtable;
  15. import java.util.StringTokenizer;
  16.  
  17. public class PluginPanel extends Panel implements AppletStub, Runnable {
  18.    private static final int APPSTATE_UNKNOWN = 0;
  19.    private static final int APPSTATE_LOADING = 1;
  20.    private static final int APPSTATE_NOTFOUND = 2;
  21.    private static final int APPSTATE_STOPPED = 3;
  22.    private static final int APPSTATE_RUNNING = 4;
  23.    private static final int APPSTATE_CRASHED = 5;
  24.    private static final int APPSTATE_DESTROYED = 6;
  25.    private static final int APPSTATE_INTERRUPTED = 7;
  26.    private static final int APPSTATE_CLASSFORMATERROR = 8;
  27.    private int appletState = 0;
  28.    private Applet applet;
  29.    private PluginContext context;
  30.    private URL codeBase;
  31.    private URL docBase;
  32.    private Hashtable params;
  33.    private Hashtable attr;
  34.    private PluginClassLoader loader;
  35.    private Thread loaderThread = null;
  36.    private Thread destroyThread = null;
  37.    private static Hashtable classLoaders = new Hashtable();
  38.  
  39.    private int getWidthParam() {
  40.       if (this.attr != null) {
  41.          String var1 = (String)this.attr.get("width");
  42.          if (var1 != null) {
  43.             return new Integer(var1);
  44.          }
  45.       }
  46.  
  47.       return 150;
  48.    }
  49.  
  50.    private int getHeightParam() {
  51.       if (this.attr != null) {
  52.          String var1 = (String)this.attr.get("height");
  53.          if (var1 != null) {
  54.             return new Integer(var1);
  55.          }
  56.       }
  57.  
  58.       return 150;
  59.    }
  60.  
  61.    public PluginPanel(PluginContext var1, Hashtable var2, Hashtable var3, URL var4) {
  62.       try {
  63.          ((Container)this).setLayout(new BorderLayout());
  64.          this.context = var1;
  65.          this.attr = var2;
  66.          this.params = var3;
  67.          this.docBase = var4;
  68.          String var5 = this.getParameter("codebase");
  69.          if (var5 != null) {
  70.             if (!var5.endsWith("/")) {
  71.                var5 = var5 + "/";
  72.             }
  73.  
  74.             try {
  75.                this.codeBase = new URL(this.docBase, var5);
  76.             } catch (MalformedURLException var12) {
  77.             }
  78.          }
  79.  
  80.          if (this.codeBase == null) {
  81.             String var6 = this.docBase.getFile();
  82.             int var7 = var6.lastIndexOf(47);
  83.             if (var7 >= 0 && var7 < var6.length() - 1) {
  84.                try {
  85.                   this.codeBase = new URL(this.docBase, var6.substring(0, var7 + 1));
  86.                } catch (MalformedURLException var11) {
  87.                }
  88.             }
  89.          }
  90.  
  91.          if (this.codeBase == null) {
  92.             this.codeBase = this.docBase;
  93.          }
  94.  
  95.          this.loader = this.getClassLoader(this.codeBase);
  96.          this.loader.grab();
  97.          if (var1 != null) {
  98.             var1.setClassLoader(this.loader);
  99.          }
  100.  
  101.          String var14 = this.getParameter("archive");
  102.          if (var14 != null) {
  103.             StringTokenizer var15 = new StringTokenizer(var14, ",", false);
  104.  
  105.             while(var15.hasMoreTokens()) {
  106.                String var8 = var15.nextToken().trim();
  107.  
  108.                try {
  109.                   this.loader.addJar(new URL(this.codeBase, var8));
  110.                } catch (IllegalArgumentException var10) {
  111.                }
  112.             }
  113.          }
  114.  
  115.          this.loader.addJar(this.codeBase);
  116.          if (this.docBase != this.codeBase) {
  117.             this.loader.addJar(this.docBase);
  118.          }
  119.       } catch (Exception var13) {
  120.          ((Throwable)var13).printStackTrace(System.err);
  121.       }
  122.  
  123.    }
  124.  
  125.    PluginClassLoader getClassLoader(URL var1) {
  126.       Hashtable var2 = classLoaders;
  127.       synchronized(var2) {
  128.          PluginClassLoader var3 = (PluginClassLoader)classLoaders.get(var1);
  129.          if (var3 == null) {
  130.             var3 = new PluginClassLoader(var1);
  131.             classLoaders.put(var1, var3);
  132.          }
  133.  
  134.          return var3;
  135.       }
  136.    }
  137.  
  138.    void resizeEmbedBox(int var1, int var2) {
  139.       PluginFrame var3 = (PluginFrame)((Component)this).getParent();
  140.       if (var3 != null) {
  141.          ((Component)var3).setSize(var1, var2);
  142.       }
  143.  
  144.       ((Component)this).setSize(var1, var2);
  145.       if (this.applet != null) {
  146.          this.applet.setSize(var1, var2);
  147.       }
  148.  
  149.       ((Container)this).validate();
  150.       this.attr.put("width", String.valueOf(var1));
  151.       this.attr.put("height", String.valueOf(var2));
  152.    }
  153.  
  154.    public void appletResize(int var1, int var2) {
  155.       ((Component)this).setSize(var1, var2);
  156.    }
  157.  
  158.    public AppletContext getAppletContext() {
  159.       return this.context;
  160.    }
  161.  
  162.    public URL getCodeBase() {
  163.       return this.codeBase;
  164.    }
  165.  
  166.    public URL getDocumentBase() {
  167.       return this.docBase;
  168.    }
  169.  
  170.    public String getParameter(String var1) {
  171.       String var2 = (String)this.params.get(var1.toLowerCase());
  172.       if (var2 == null) {
  173.          var2 = (String)this.attr.get(var1.toLowerCase());
  174.       }
  175.  
  176.       return var2;
  177.    }
  178.  
  179.    public boolean isActive() {
  180.       return this.appletState == 4;
  181.    }
  182.  
  183.    public void loadApplet() {
  184.       try {
  185.          ThreadGroup var1 = this.loader.getThreadGroup();
  186.          this.loaderThread = new Thread(var1, this);
  187.          this.loaderThread.start();
  188.       } catch (Exception var2) {
  189.          ((Throwable)var2).printStackTrace(System.err);
  190.       }
  191.  
  192.    }
  193.  
  194.    public void startApplet() {
  195.       try {
  196.          if (this.applet != null && this.appletState == 3) {
  197.             this.applet.resize(this.getWidthParam(), this.getHeightParam());
  198.             this.applet.start();
  199.             this.appletState = 4;
  200.             this.applet.validate();
  201.             this.applet.setVisible(true);
  202.             this.context.showStatus("Applet started.");
  203.          }
  204.       } catch (Exception var2) {
  205.          ((Throwable)var2).printStackTrace(System.err);
  206.          if (this.appletState != 4) {
  207.             this.appletState = 5;
  208.             ((Component)this).repaint();
  209.          }
  210.       }
  211.  
  212.    }
  213.  
  214.    public void stopApplet() {
  215.       if (this.applet != null && this.appletState == 4) {
  216.          try {
  217.             this.applet.stop();
  218.          } catch (Exception var2) {
  219.             ((Throwable)var2).printStackTrace(System.err);
  220.          }
  221.  
  222.          this.appletState = 3;
  223.       }
  224.  
  225.    }
  226.  
  227.    public void destroyApplet() {
  228.       try {
  229.          if (this.loaderThread != null) {
  230.             try {
  231.                this.loaderThread.interrupt();
  232.                this.loaderThread.join();
  233.             } catch (Exception var3) {
  234.                ((Throwable)var3).printStackTrace(System.err);
  235.             }
  236.  
  237.             this.loaderThread = null;
  238.          }
  239.  
  240.          if (this.loader != null) {
  241.             this.destroyThread = new Thread(this.loader.getThreadGroup(), this);
  242.             if (this.destroyThread != null) {
  243.                this.destroyThread.start();
  244.             }
  245.          }
  246.       } catch (Exception var4) {
  247.          ((Throwable)var4).printStackTrace(System.err);
  248.       } catch (Error var5) {
  249.          ((Throwable)var5).printStackTrace(System.err);
  250.       }
  251.  
  252.    }
  253.  
  254.    public Applet getApplet() {
  255.       return this.applet;
  256.    }
  257.  
  258.    public void run() {
  259.       if (Thread.currentThread() == this.destroyThread) {
  260.          if (this.applet != null) {
  261.             if (this.appletState == 4) {
  262.                this.stopApplet();
  263.             }
  264.  
  265.             this.applet.destroy();
  266.             this.applet = null;
  267.             this.appletState = 6;
  268.          }
  269.  
  270.          if (this.loader != null) {
  271.             this.loader.release();
  272.             this.loader = null;
  273.          }
  274.  
  275.          this.destroyThread = null;
  276.       } else {
  277.          try {
  278.             String var1 = (String)this.attr.get("code");
  279.             if (var1 != null) {
  280.                int var2 = var1.length();
  281.                String var3 = var1.substring(0, var2 - 6);
  282.                this.appletState = 1;
  283.                ((Component)this).repaint();
  284.                Class var4 = this.loader.loadClass(var3);
  285.                if (var4 != null) {
  286.                   this.applet = (Applet)var4.newInstance();
  287.                   if (this.applet != null) {
  288.                      this.appletState = 3;
  289.                      ((Component)this).repaint();
  290.                      this.applet.setStub(this);
  291.                      this.applet.setVisible(false);
  292.                      ((Container)this).add("Center", this.applet);
  293.                      ((Container)this).validate();
  294.                      ((Component)this).setSize(this.getWidthParam(), this.getHeightParam());
  295.                      this.applet.resize(this.getWidthParam(), this.getHeightParam());
  296.                      this.context.showStatus("Initializing applet.");
  297.  
  298.                      try {
  299.                         this.applet.init();
  300.                         ((Container)this).validate();
  301.                         this.startApplet();
  302.                      } catch (Exception var6) {
  303.                         ((Throwable)var6).printStackTrace(System.err);
  304.                         this.appletState = 5;
  305.                         ((Component)this).repaint();
  306.                      }
  307.                   } else {
  308.                      this.appletState = 2;
  309.                      ((Component)this).repaint();
  310.                   }
  311.                } else {
  312.                   this.appletState = 2;
  313.                   ((Component)this).repaint();
  314.                }
  315.             }
  316.  
  317.             this.loaderThread = null;
  318.          } catch (ClassNotFoundException var7) {
  319.             this.appletState = 2;
  320.             ((Component)this).repaint();
  321.             this.loaderThread = null;
  322.          } catch (Exception var8) {
  323.             this.appletState = 5;
  324.             ((Component)this).repaint();
  325.             ((Throwable)var8).printStackTrace(System.err);
  326.             this.loaderThread = null;
  327.          } catch (ClassFormatError var9) {
  328.             this.appletState = 8;
  329.             ((Component)this).repaint();
  330.             ((Throwable)var9).printStackTrace(System.err);
  331.          } catch (Error var10) {
  332.             this.appletState = 5;
  333.             ((Component)this).repaint();
  334.             ((Throwable)var10).printStackTrace(System.err);
  335.             this.loaderThread = null;
  336.          }
  337.       }
  338.  
  339.    }
  340.  
  341.    public void paint(Graphics var1) {
  342.       try {
  343.          if (this.appletState != 0 && this.appletState != 4) {
  344.             FontMetrics var2 = var1.getFontMetrics();
  345.             String var3;
  346.             switch (this.appletState) {
  347.                case 1:
  348.                   var3 = "Loading applet...";
  349.                   break;
  350.                case 2:
  351.                   var3 = "Applet not found.";
  352.                   break;
  353.                case 3:
  354.                   var3 = "Applet loaded.";
  355.                   break;
  356.                case 4:
  357.                default:
  358.                   var3 = "";
  359.                   break;
  360.                case 5:
  361.                   var3 = "Applet crashed.";
  362.                   break;
  363.                case 6:
  364.                   var3 = "Applet destroyed.";
  365.                   break;
  366.                case 7:
  367.                   var3 = "Loading interrupted.";
  368.                   break;
  369.                case 8:
  370.                   var3 = "Invalid bytecode.";
  371.             }
  372.  
  373.             int var4 = var2.stringWidth(var3);
  374.             int var5 = (((Component)this).getWidth() - var4) / 2;
  375.             if (var5 < 0) {
  376.                var5 = 0;
  377.             }
  378.  
  379.             var1.drawString(var3, var5, ((Component)this).getHeight() / 2);
  380.          }
  381.       } catch (Exception var6) {
  382.          ((Throwable)var6).printStackTrace(System.err);
  383.       }
  384.  
  385.    }
  386. }
  387.